Pocketer-CRA项目说明
主要技术介绍
使用graphql和mongodb和 create-react-app构建的项目
分为三部分:
①
.网站内容抓取并存入到mlab数据库②
.构建graphql-server服务器提供查询服务,后台通过mongoose和mlab交互,获取查询信息。③
.前端的CRA程序,使用react-apollo-hooks和graphql服务器交互获取查询信息
网站内容抓取
程序组成信息
通过 http://gdom.graphene-python.org/graphql
获取Pocketer的内容信息。 这是request
模块需要的graphql服务器
地址url地址.
Dom结构如下:
1 | const getList = `query getList($url:String!){ |
传入要抓取网站的链接,填入要获取信息的dom结构信息。这是request
模块需要的的template信息.
代码结构
request 函数柯里化
1 | //使用Ramda 柯里化 request函数的参数 |
传入url地址到获取整个抓取对象的数据流,ramda的compose函数负责从右向左传递数据
1 | //1 拼接链接字符串 |
借助Mongoose插入数据到mlab 数据库config.js
1 | const mongoose = require('mongoose'); |
在config.js
文件中配置mlab数据库和mongoose配置,mongoose需要设置schema,mongoose的schema和Graphql的schema很相似,所以一起使用很方便
1 | const mongoose = require('mongoose'); |
创建的额newModel模型性对象就挂在了根据schema操作mongodb的方法。直接执行及㐓了
插入操作
1 | const dbForData= async (args)=>{ |
只只要提供的参数和schema的一样,插入就很简单,只要一个model.create(args)
就可以了。
模型中定义了cate,用于pocketer的分类, 所以在从网站抓取的信息中添加这个cate字段
1 | //获取的数据 |
遍历数组,执行插入操作
1 | await R.map(dbForData,ArrayaddCate); |
以上代码是单个搜索字符串的插入结果,每个字符串下面可以查到很多文章。 相当于单个售票窗口的队列。 但是我们可以传入多个字符串,这就相当于售票处开了多个窗口。多个窗口之间的操作是并行执行的。 在单个窗口的操作其实也可以是并行操作。这里没有考虑。
执行多个字符串的操作,代码如下:
1 | const insertData= async (items)=> { |
上面代码中items就是传入的多个查询字符串组成的数组, 遍历它,因为数组中每个字符串元素返回的都是promise对象, 使用map方法组成promise数组,
然后使用Promise.all方法并行执行操作。
单个字符串的流程还要修改一下,每篇文章的操作仍然是并发的
本地的graphql-server的构建
使用了apollo-graphql-express构建
提供 typeDefs
和resolvers
就可以了。 服务器接受执行指令, 然后在resolvers中执行数据库操作,然后返回Graphql结果
graphql参数定义
1 | const typeDefs = gql` |
graphQL服务器初始化
1 | const server = new ApolloServer({ typeDefs, resolvers }); |
Create-React-App 构建
添加了styled-components,reactstrap,react-apollo-hooks。